package cz.vse.adventura.po1715.cerj117_cermak;

import cz.pecinovsky.english.pojj.adv_framework.game_txt.IGame;
import cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfScenario;
import cz.pecinovsky.english.pojj.adv_framework.scenario.ScenarioStep;
import cz.pecinovsky.english.pojj.adv_framework.scenario.AScenarioManager;
//import cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfStep;
import cz.pecinovsky.english.pojj.adv_framework.test_util._SpouštěníScénářů;

import cz.pecinovsky.english.pojj.adv_framework.test_util._TestSprávceScénářů;
import cz.vse.adventura.po1715.cerj117_cermak.hra.MojeHra;

import static  cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfStep.*;

 

/*******************************************************************************
 * Instance třída {@code SprávceScénářůL} slouží jako správce scénářů,
 * které mají prověřit a/nebo demonstrovat správnou funkci plánované hry.
 * Jednotlive scénáře jsou iterovatelné posloupností kroků specifikovaných
 * instancemi třídy <code>ScenarioStep</code> z rámce, do nějž se hra začleňuje.
 * <p>
 * Správce scénářů je jedináček, který má na starosti všechny scénáře
 * týkající se s ním sdružené hry.
 *
 * @author Jiří ČERMÁK
 * @version 1.00,  19.11.2010
 */
public class SprávceScénářůL extends AScenarioManager
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Třída, jejíž instance jsou zde spravovány. */
    private final static Class<? extends IGame> TŘÍDA = MojeHra.class;

    /** Jmeno autora/autorky třídy. */
    private static final String autor = "ČERMÁK Jiří";

    /** X-name autora/autorky třídy. */
    private static final String xname = "XCERJ117";


    /***************************************************************************
     * Konstruktor plnohodnotné instance třídy {@link ScenarioStep}
     * vyžaduje následující parametry:
     *      String   příkaz;    //Příkaz realizující tetno krok scénáře
     *      String   zpráva;    //Zpráva vypsaná po zadání příkazu
     *      String   prostor;   //Prostor, v něž skončí hráč po zadání příkazu
     *      String[] východy;   //Aktuální východy z aktuálního prostoru
     *      String[] objekty;   //Objekty vyskytující se v daném prostoru
     *      String[] batoh;     //Aktuální obsah batohu
     *      TypeOfStep typTestu;  //Typ daného kroku testu
     */


    /***************************************************************************
     * Základní scénář popisující možný úspěšný průběh hry.
     */
    private static final ScenarioStep[] základní =
    {
        new ScenarioStep( "", //Název prvního příkazu musí být prázdný řetězec
            "Vítám Tě ve hře STIHNI VLAK A NEPOSER SE. " +
            "\nJsi právě na cestě na vlak do Prahy, ale zaskočila Tě základní lidská potřeba." +
            "\nNení to sex ani jídlo, ale toaleta. Co teď?" +
            "\n\nNacházíte se v místnosti: Náměstí" +
          "\nMůžete se přesunout do místností: park, pěší zóna, banka, hospoda" +
          "\nV místnosti se nachází: kašna, strom, auto, babička" +
          "\nMáte v držení předměty: ",

            "Náměstí",
            new String[] { "park", "pěšíZóna", "banka", "hospoda", "nádraží" },
            new String[] { "kašna", "strom", "auto", "babička" },
            new String[] {    },
            tsSTART ),

        new ScenarioStep( "jdi banka",
            "\nPřesunul(a) jste se do místnosti: banka" +
          "\nMůžete se přesunout do místností: Náměstí" +
          "\nV místnosti se nachází: Sekretářka, stůl" +
          "\nMáte v držení předměty: ",
            "Banka",
            new String[] { "Náměstí" },
            new String[] { "Sekretářka", "Stůl" },
            new String[] {    },
            tsMOVE ),

        new ScenarioStep( "jdi Náměstí",
            "\nPřesunul(a) jste se do místnosti: náměstí" +
          "\nMůžete se přesunout do místností: park, pěší zóna, banka, hospoda" +
          "\nV místnosti se nachází: kašna, strom, auto, babička" +
          "\nMáte v držení předměty:",
            "Náměstí",
            new String[] { "park", "pěšíZóna", "banka", "hospoda", "nádraží" },
            new String[] { "kašna", "strom", "auto", "babička" },
            new String[] {    },
            tsMOVE ),

        new ScenarioStep( "jdi Hospoda",
            "\nPřesunul(a) jste se do místnosti: hospoda" +
          "\nMůžete se přesunout do místností: sklad, toalety, Náměstí" +
          "\nV místnosti se nachází: stůl, hospodský, židle" +
          "\nMáte v držení předměty:",
            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {   },
            tsMOVE ),

         new ScenarioStep( "půjčit klíč",
            "\nNemůžete si jen tak půjčit klíč od toalet. Můsíte si nejdříve něco objednat." +
          "\nMůžete se přesunout do místností: Náměstí, Sklad, Toalety" +
          "\nV místnosti se nachází: stůl, hospodský, židle" +
          "\nMáte v držení předměty: ",
            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {    },
            tsNON_STANDARD ),

         new ScenarioStep( "objednat kofola",
            "\nObjednal sis kofolu." +
        "\n\nNacházíte se v místnosti: Hospoda" +
          "\nMůžete se přesunout do místností: Náměstí, Sklad, Toalety" +
          "\nV místnosti se nachází: stůl, hospodský, židle" +
          "\nMáte v držení předměty: ",
            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {    },
            tsNON_STANDARD ),

          new ScenarioStep( "půjčit klíč",
            "\n Půjčil jste si klíč od toalet." +
        "\n\nNacházíte se v místnosti: Hospoda" +
          "\nMůžete se přesunout do místností: Náměstí, Sklad, Toalety" +
          "\nV místnosti se nachází: stůl, hospodský, židle" +
          "\nMáte v držení předměty: ",
            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {    },
            tsNON_STANDARD ),

          new ScenarioStep( "jdi toalety",
            "Přesunul(a) jste se do místnosti: toalety" +
        "\n\nNacházíte se v místnosti: Toalety" +
          "\nMůžete se přesunout do místností: hospoda" +
          "\nV místnosti se nachází: umyvadlo, toaleta, mýdlo, ručník, zrcadlo, toaletní papír" +
          "\nMáte v držení předměty: ",
            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Mýdlo", "Ručník", "Zrcadlo", "ToaletníPapír"   },
            new String[] {    },
            tsMOVE ),

        new ScenarioStep( "vezmi ToaletníPapír",
            "\nVzal(a) jste předmět: toaletníPapír" +
        "\n\nNacházíte se v místnosti: Toalety" +
          "\nMůžete se přesunout do místností: hospoda" +
          "\nV místnosti se nachází: umyvadlo, toaleta, mýdlo, ručník, zrcadlo, toaletní papír" +
          "\nMáte v držení předměty: peněženka, toaletní papír",
            "Toalety",
           new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Mýdlo", "Ručník", "Zrcadlo"  },
            new String[] {  "ToaletníPapír"   },
            tsPICK_UP ),

         new ScenarioStep( "vykonejPotřebu",
            "\nVysral jste se. To je úleva. Slušní lidé si umyjí ruce." +
        "\n\nNacházíte se v místnosti: Toalety" +
          "\nMůžete se přesunout do místností: hospoda" +
          "\nV místnosti se nachází: umyvadlo, toaleta, mýdlo, ručník, zrcadlo, toaletní papír" +
          "\nMáte v držení předměty: peněženka, toaletní papír",
            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Mýdlo", "Ručník", "Zrcadlo" },
            new String[] {  "ToaletníPapír"   },
            tsNON_STANDARD ),

          new ScenarioStep( "polož ToaletníPapír",
            "\n Položil(a) jste předmět: toaletníPapír" +
        "\n\nNacházíte se v místnosti: Toalety" +
          "\nMůžete se přesunout do místností: hospoda" +
          "\nV místnosti se nachází: umyvadlo, toaleta, mýdlo, ručník, zrcadlo, toaletní papír" +
          "\nMáte v držení předměty: peněženka, toaletní papír",
            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Mýdlo", "Ručník", "Zrcadlo", "ToaletníPapír"   },
            new String[] {    },
            tsPUT_DOWN ),

         new ScenarioStep( "umyj ruce",
            "\nUmyl sis ruce." +
          "\nMůžete se přesunout do místností: hospoda" +
          "\nV místnosti se nachází: umyvadlo, toaleta, mýdlo, ručník, zrcadlo, toaletní papír" +
          "\nMáte v držení předměty: peněženka",
            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Mýdlo", "Ručník", "Zrcadlo", "ToaletníPapír"   },
            new String[] {    },
            tsNON_STANDARD ),

          new ScenarioStep( "jdi hospoda",
            "\nPřesunul(a) jste se do místnosti: hospoda" +
          "\nV místnosti se nachází: umyvadlo, toaleta, mýdlo, ručník, zrcadlo, toaletní papír" +
          "\nMáte v držení předměty: peněženka",
            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {    },
            tsMOVE ),

          new ScenarioStep( "zaplať",
            "\nZaplatil si a můžeš odejít." +
          "\nMůžete se přesunout do místností: Náměstí, Sklad, Toalety" +
          "\nV místnosti se nachází: stůl, hospodský, židle, kofola" +
          "\nMáte v držení předměty: peněženka",
            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "Kofola", "klíč" },
            new String[] {    },
            tsNON_STANDARD ),

         new ScenarioStep( "vezmi Kofola",
            "\nVzal(a) jste předmět: kofola" +
          "\nMůžete se přesunout do místností: Náměstí, Sklad, Toalety" +
          "\nV místnosti se nachází: stůl, hospodský, židle, kofola" +
          "\nMáte v držení předměty: peněženka",
            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč" },
            new String[] {  "Kofola"  },
            tsPICK_UP ),

         new ScenarioStep( "jdi Náměstí",
            "\nPřesunul(a) jste se do místnosti: náměstí" +
          "\nMůžete se přesunout do místností: park, pěší zóna, banka, hospoda" +
          "\nV místnosti se nachází: kašna, strom, auto, babička" +
          "\nMáte v držení předměty: peněženka, kofola",
            "Náměstí",
            new String[] { "park", "pěšíZóna", "banka", "hospoda", "nádraží" },
            new String[] { "kašna", "strom", "auto", "babička" },
            new String[] {  "kofola"   },
            tsMOVE ),

         new ScenarioStep( "jdi Nádraží",
            "\nPřesunul(a) jste se do místnosti: nádraží" +
          "\nMůžete se přesunout do místností: náměstí" +
          "\nV místnosti se nachází: pokladna, vlak" +
          "\nMáte v držení předměty: peněženka, kofola",
            "Nádraží",
            new String[] { "Náměstí" },
            new String[] { "vlak", "pokladna", "lavička" },
            new String[] {  "kofola"   },
            tsMOVE ),

          new ScenarioStep( "nastup",
            "\nÚspěšně jste nastoupil do vlaku a můžeš odjet." +
          "\nV místnosti se nachází: pokladna, vlak" +
          "\nMáte v držení předměty: peněženka, kofola",
            "Nádraží",
            new String[] { "Náměstí" },
            new String[] { "vlak", "pokladna", "lavička" },
            new String[] {  "kofola"   },
            tsNON_STANDARD ),


        new ScenarioStep( "konec",
            "Konec hry. Děkuji za ozkoušení mojí hry.",
            "Nádraží",
             new String[] { "Náměstí" },
            new String[] { "vlak", "pokladna", "lavička" },
            new String[] {  "kofola"   },
            tsEND )
        //V úspěsném scénáři nemusí být typ posledního příkazu tsEND
        //Hra může končit i prostým dosažením požadovaného cíle
    };


    /***************************************************************************
     * Základní chybový scénář definující reakce
     * na povinnou sadu chybových stavů.
     */
    private static final ScenarioStep[] chybový =
    {
        new ScenarioStep( "", //Název prvního příkazu musí být prázdný řetězec
            "Vítám Tě ve hře STIHNI VLAK A NEPOSER SE. " +
            "\nJsi právě na cestě na vlak do Prahy, ale zaskočila Tě základní lidská potřeba." +
            "\nNení to sex ani jídlo, ale toaleta. Co teď?" +
            "\n\nNacházíte se v místnosti: Náměstí" +
          "\nMůžete se přesunout do místností: park, pěší zóna, banka, hospoda" +
          "\nV místnosti se nachází: kašna, strom, auto, babička" +
          "\nMáte v držení předměty: peněženka",

            "Náměstí",
            new String[] { "park", "pěšíZóna", "banka", "hospoda", "nádraží" },
            new String[] { "kašna", "strom", "auto", "babička" },
            new String[] {   },
            tsSTART ),

        new ScenarioStep( "záchod",
            "Tento příkaz neznám. Chcete-li poradit, zadejte příkaz ?",

            "Náměstí",
            new String[] { "park", "pěšíZóna", "banka", "hospoda", "nádraží" },
            new String[] { "kašna", "strom", "auto", "babička" },
            new String[] {   },
            tsUNKNOWN ),

        new ScenarioStep( "",
            "Zadal(a) jste prázdný příkaz. Chcete-li poradit, zadejte příkaz ?",

            "Náměstí",
            new String[] { "park", "pěšíZóna", "banka", "hospoda", "nádraží" },
            new String[] { "kašna", "strom", "auto", "babička" },
            new String[] {   },
            tsEMPTY ),


        new ScenarioStep( "jdi Hospoda",
            "Přesunul(a) jste se do místnosti: Hospoda",

            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {   },
            tsMOVE ),

        new ScenarioStep( "jdi nádraží",
            "Do zadané místnosti se odsud nedá přejít.",

            "Hospoda",
             new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {   },
            tsBAD_NEIGHBOR ),

        new ScenarioStep( "vezmi postel",
            "Zadaný předmět v místnosti není: postel",

            "Hospoda",
             new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {   },
            tsBAD_OBJECT ),

        new ScenarioStep( "vezmi stůl",
            "Zadaný předmět nejde zvednout: stůl",

            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {   },
            tsUNMOVABLE ),

        new ScenarioStep( "polož ToaletníPapír",
            "Předmět není v batohu: toaletnípapír",

            "Hospoda",
            new String[] { "Náměstí", "Toalety", "Sklad" },
            new String[] { "stůl", "Židle", "Hospodský", "klíč", "kofola" },
            new String[] {   },
            tsNOT_IN_BAG ),

        new ScenarioStep( "jdi Toalety",
            "Přesunul(a) jste se do místnosti: toalety",
            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Mýdlo", "Ručník", "Zrcadlo", "ToaletníPapír"   },
            new String[] {   },
            tsMOVE ),

         new ScenarioStep( "vezmi mýdlo",
            "Vzal(a) jste předmět: mýdlo",

            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Ručník", "Zrcadlo", "ToaletníPapír"   },
            new String[] {  "mýdlo"   },
            tsPICK_UP ),

         new ScenarioStep( "vezmi ToaletníPapír",
            "Vzal(a) jste předmět: toaletníPapír",

            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Ručník", "Zrcadlo"   },
            new String[] {  "mýdlo", "toaletníPapír"   },
            tsPICK_UP ),

        new ScenarioStep( "vezmi Ručník",
            "Zadaný předmět nejde zvednout: ručník",

            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Ručník", "Zrcadlo"  },
            new String[] { "mýdlo", "toaletníPapír"   },
            tsBAG_FULL ),

        new ScenarioStep("?",
            "\nPříkazy, které je možno v průběhu hry zadat:" +
            "\n============================================",
            //Text pokračuje vyjmenováním příkazů a jejich popisů
            //a končí standardním popisem aktuální situace

            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Ručník", "Zrcadlo"   },
            new String[] { "mýdlo", "toaletníPapír"   },
            tsHELP ),

        new ScenarioStep( "konec",
            "Konec hry. Děkuji za ozkoušení mojí hry.",

            "Toalety",
            new String[] { "Hospoda" },
            new String[] { "Umyvadlo", "Toaleta", "Ručník", "Zrcadlo"   },
            new String[] {  "mýdlo", "ToaletníPapír"   },
            tsEND ),
    };


    /** Jediná instance této třídy. Spravuje všechny scénáře sdružené hry. */
    private static final SprávceScénářůL SS = new SprávceScénářůL();
    


//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vrátí správce scénářů - jedinou instanci této třídy.
     *
     * @return Správce scénářů
     */
    public static SprávceScénářůL getInstance()
    {
        return SS;
    }


    /***************************************************************************
     * Vytvoří instanci představující správce scénářů hry.
     */
    private SprávceScénářůL()
    {
        super(autor, xname, TŘÍDA);
        přidejScénáře();
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================

    /***************************************************************************
     * Přidá správci všechny vytvořené scénáře.
     */
   private void přidejScénáře()
    {
        addScenario("Základní", TypeOfScenario.scHAPPY, základní);
        addScenario("Chybový",  TypeOfScenario.scMISTAKES, chybový);
        addScenario("Demo for GUI", new String[] {"jdi      banka",
                                                  "jdi      náměstí",
                                                  "jdi      hospoda",
                                                  "vezmi    židle",
                                                  "objednat kofola",
                                                  "půjčit   klíč",
                                                  "jdi      toalety",
                                                  "vezmi    toaletníPapír",
                                                  "vykonejPotřebu",
                                                  "polož    toaletníPapír",
                                                  "jdi      hospoda",
                                                  "vezmi    kofola",
                                                  "jdi      náměstí",
                                                  "polož    kofola",
                                                  "konec"
        });
        seal();
    }



//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================

    /***************************************************************************
     * Základní test ověřující, jestli správce scénářů vyhovuje
     * zadným okrajovým podmínkám.
     */
    public static void test()
    {
        _TestSprávceScénářů test = new _TestSprávceScénářů();
        test.testuj(SS);
    }


    /***************************************************************************
     * Simulace průběhu hry podle základního úspěšného scénáře.
     */
    public static void simulujÚspěšný()
    {
        _SpouštěníScénářů .simulujStručně (SS.getScenario(0));
    }


    /***************************************************************************
     * Simulace průběhu hry podle základního chybového scénáře.
     */
    public static void simulujChybový()
    {
        _SpouštěníScénářů .simulujStručně (SS.getScenario(1));
    }


    /***************************************************************************
     * Testování funkce hry prováděné postupně
     * prostřednictvím všech scénářů daného správce
     */
    public static void prověrkaHry()
    {
        IGame hra = MojeHra.getHra();
        _SpouštěníScénářů .proveďScénáře(hra);
    }


    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )
    {
        test();
        simulujÚspěšný();
        simulujChybový();
        prověrkaHry();
    }
}
